export default ({ store, route, redirect, $axios }) => {
    $axios.onRequest(config => {
        // 请求头添加token
        const accessToken = store.state.accessToken
        if (accessToken) {
            // 针对每个请求，请求头带上令牌 Authorization: Bearer token
            config.headers.Authorization = 'Bearer ' + accessToken
        }
        return config
    })
    $axios.onResponse(response => {
        return response
    })
    $axios.onError(error => {
        console.log('响应异常：', error.response.status)
        if (error.response.status != 401) {
            return Promise.reject(error)
        }
        //返回的是401错误码就代表accessToken过期，需要发送refreshToken刷新令牌重新刷新身份信息
        // 401 发送刷新令牌请求
        sendRefreshRequest(store, route, redirect)
        return Promise.reject('令牌过期，重新登录')
    })
}

//封装函数
//防止并发发送多个刷新请求,true为没有发请求，false表示正在请求
let islock = true
const sendRefreshRequest = (store, route, redirect) => {
    //refreshToken存在就发请求刷新信息
    if (islock && store.state.refreshToken) {
        islock = false
        //跳转到refresh页刷新信息
        redirect(`${process.env.authURL}/refresh?redirectURL=${redirectURL(route)}`)
    } else {
        islock = true
        //没有refreshToken就跳转到登录页重新登陆
        //注意这里不能使用store.dispatch('LoginPage')，因为这个axios配置插件客户端和服务端都可以访问，LoginPage里面使用了window，但是服务端不能使用window
        store.commit('RESET_USER_STATE')
        redirect(`${process.env.authURL}?redirectURL=${redirectURL(route)}`)
    }
}
//获取重定向路径
const redirectURL = (route) => {
    //nuxt提供的process.client可以判断当前是客户端还是服务端
    //客户端
    if (process.client) {
        return window.location.href
    }
    //服务端
    // 服务端 process.env._AXIOS_BASE_URL_  获取到axios请求的完整基础路径->http://localhost:3000/api  http://blog.mengxuegu.com/api
    // route.path为当前的路由路径（url的最后一部分）
    return process.env._AXIOS_BASE_URL_.replace('api', '') + route.path
}